import re


class DeviceValidator:
    """设备ID和MAC地址验证工具类"""

    @staticmethod
    def validate_device_id(device_id):
        """
        验证设备ID是否合法
        规则：整数或者HEX字符串，且转化为整数时不超过4Byte（即0~4294967295）

        参数:
            device_id: 待验证的设备ID（字符串或整数）

        返回:
            tuple: (是否合法, 错误信息或转换后的整数)
        """
        if not device_id:
            return (False, "设备ID不能为空")

        # 处理整数情况
        if isinstance(device_id, int):
            if 0 <= device_id <= 0xFFFFFFFF:  # 4Byte最大值
                return (True, device_id)
            else:
                return (False, f"设备ID超出4Byte范围（最大值为{0xFFFFFFFF}）")

        # 处理字符串情况
        if isinstance(device_id, str):
            device_id = device_id.strip()
            if not device_id:
                return (False, "设备ID不能为空")

            # 检查是否为十进制整数
            if device_id.isdigit():
                try:
                    num = int(device_id)
                    if 0 <= num <= 0xFFFFFFFF:
                        return (True, num)
                    else:
                        return (False, f"设备ID超出4Byte范围（最大值为{0xFFFFFFFF}）")
                except:
                    return (False, "无效的整数格式")

            # 检查是否为十六进制字符串
            hex_pattern = re.compile(r'^0x[0-9a-fA-F]+$|^[0-9a-fA-F]+h?$')
            if hex_pattern.match(device_id):
                # 移除前缀和后缀
                clean_hex = device_id.lower().replace('0x', '').replace('h', '')
                try:
                    num = int(clean_hex, 16)
                    if 0 <= num <= 0xFFFFFFFF:
                        return (True, num)
                    else:
                        return (False, f"十六进制设备ID超出4Byte范围（最大值为0xFFFFFFFF）")
                except:
                    return (False, "无效的十六进制格式")

        return (False, "设备ID必须是整数或十六进制字符串")

    @staticmethod
    def validate_mac(mac_address):
        """
        验证MAC地址是否合法
        规则：格式为88:88:88:88:88:88或00-00-00-00-00-00，不区分大小写

        参数:
            mac_address: 待验证的MAC地址

        返回:
            tuple: (是否合法, 错误信息或标准化后的MAC地址)
        """
        if not mac_address:
            return (False, "MAC地址不能为空")

        if not isinstance(mac_address, str):
            return (False, "MAC地址必须是字符串")

        mac = mac_address.strip()
        if not mac:
            return (False, "MAC地址不能为空")

        # 检查MAC地址格式（冒号分隔或连字符分隔）
        colon_pattern = re.compile(r'^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$')
        hyphen_pattern = re.compile(r'^([0-9a-fA-F]{2}-){5}[0-9a-fA-F]{2}$')
        none_pattern = re.compile(r'^([0-9a-fA-F]{2}){5}[0-9a-fA-F]{2}$')

        if colon_pattern.match(mac) or hyphen_pattern.match(mac) or none_pattern.match(mac):
            # 标准化为小写冒号格式
            normalized_mac = mac.lower().replace('-', ':')
            return (True, normalized_mac)
        else:
            return (False, "MAC地址格式无效，应为88:88:88:88:88:88或00-00-00-00-00-00或888888888888")
